﻿using System;
using System.IO;
using System.Linq;

namespace LeastSquares
{
    class Program
    {
        // заданные пользователем точки
        static double[] x = new double[100], y = new double[100];

        static void Main(string[] args)
        {
            // считываем данные из файла
            ReadData();
            // максимальная длина
            int n = Math.Min(x.Length, y.Length);

            double
                // вычисление формулы 1
                s1 = x.Aggregate(0.0, (current, item) => current + item),
                // вычисление формулы 2
                s2 = y.Aggregate(0.0, (current, item) => current + item),
                // вычисление формулы 3
                s3 = x.Aggregate(0.0, (current, item) => current + item * item),
                s4 = 0;
            // вычисление формулы 4
            for (int i = 0; i < n; i++)
                s4 += x[i] * y[i];
            // вычисление коэффициентов прямой
            double a = (s4 - (s1 * s2) / n) / (s3 - s1 * s1 / n),
                   b = (s2 - a * s1) / n;
            // вывод данных
            echo("a = " + a);
            echo("b = " + b);

            Console.WriteLine("Write the argument: ");
            // ввод аргумента и вычисление функции
            double
                arg = Convert.ToDouble(Console.ReadLine()),
                func = a * arg + b;
            echo(func);

            Console.ReadKey();
        }

        /// <summary>
        /// Read data from file.
        /// </summary>
        public static void ReadData()
        {
            StreamReader r = new StreamReader(@"D:\MSVSProjects\Erofeev\LeastSquares\bin\Debug\data.txt", System.Text.Encoding.UTF8);
            string s = "";
            int i = 0;
            while ((s = r.ReadLine()) != null)
            {
                x[i] = Convert.ToDouble(s.Split(' ')[0]);
                y[i] = Convert.ToDouble(s.Split(' ')[1]);
                i++;
            }
            r.Close();
        }

        /// <summary>
        /// Console.WriteLine(s).
        /// </summary>
        /// <param name="s"></param>
        public static void echo(dynamic s)
        {
            Console.WriteLine(s);
        }
    }
}

